"""系统管理工具模块.

本模块提供系统级监控和管理功能,包括:
1. 系统信息收集
2. 资源使用监控
3. 进程管理
4. 网络监控
5. 系统健康检查
"""

import os
import platform
import psutil
from typing import Dict, List, Tuple

from .logger import logger


class SystemMonitor:
    """系统监控类,提供系统级监控和管理功能."""
    
    @staticmethod
    def get_system_info() -> Dict:
        """获取系统基本信息.
        
        收集以下信息:
        - 操作系统类型和版本
        - Python版本
        - CPU核心数
        - 内存总量
        - 磁盘总量
        
        Returns:
            Dict: 系统信息字典
        """
        try:
            return {
                "os": platform.system(),
                "os_version": platform.version(),
                "python_version": platform.python_version(),
                "cpu_count": psutil.cpu_count(),
                "memory_total": psutil.virtual_memory().total,
                "disk_total": psutil.disk_usage('/').total
            }
        except Exception as e:
            logger.error(f"获取系统信息时发生错误: {e}")
            return {}
    
    @staticmethod
    def get_process_info() -> Dict:
        """获取当前进程信息.
        
        收集以下信息:
        - 进程ID
        - CPU使用率
        - 内存使用率
        - 线程数
        - 网络连接数
        
        Returns:
            Dict: 进程信息字典
        """
        try:
            process = psutil.Process()
            return {
                "pid": process.pid,
                "cpu_percent": process.cpu_percent(),
                "memory_percent": process.memory_percent(),
                "threads": process.num_threads(),
                "connections": len(process.connections())
            }
        except Exception as e:
            logger.error(f"获取进程信息时发生错误: {e}")
            return {}
    
    @staticmethod
    def get_resource_usage() -> Tuple[float, float, float]:
        """获取当前资源使用情况.
        
        Returns:
            Tuple[float, float, float]: CPU使用率, 内存使用率, 磁盘使用率
        """
        try:
            cpu_percent = psutil.cpu_percent()
            memory_percent = psutil.virtual_memory().percent
            disk_percent = psutil.disk_usage('/').percent
            return cpu_percent, memory_percent, disk_percent
        except Exception as e:
            logger.error(f"获取资源使用情况时发生错误: {e}")
            return 0.0, 0.0, 0.0
    
    @staticmethod
    def get_network_info() -> Dict:
        """获取网络接口信息.
        
        收集所有活动网络接口的:
        - 速度
        - MTU
        - 双工模式
        
        Returns:
            Dict: 网络接口信息字典
        """
        try:
            network_info = {}
            for interface, stats in psutil.net_if_stats().items():
                if stats.isup:
                    network_info[interface] = {
                        "speed": stats.speed,
                        "mtu": stats.mtu,
                        "duplex": stats.duplex
                    }
            return network_info
        except Exception as e:
            logger.error(f"获取网络信息时发生错误: {e}")
            return {}
    
    @staticmethod
    def get_environment_vars() -> Dict:
        """获取相关环境变量.
        
        Returns:
            Dict: 环境变量字典
        """
        try:
            relevant_vars = [
                "PYTHONPATH",
                "PATH",
                "VIRTUAL_ENV",
                "LANG",
                "TZ"
            ]
            return {
                var: os.environ.get(var)
                for var in relevant_vars
                if var in os.environ
            }
        except Exception as e:
            logger.error(f"获取环境变量时发生错误: {e}")
            return {}
    
    @staticmethod
    def get_running_services() -> List[Dict]:
        """获取运行中的服务信息.
        
        Returns:
            List[Dict]: 服务信息列表
        """
        try:
            services = []
            for proc in psutil.process_iter(['pid', 'name', 'username']):
                try:
                    proc_info = proc.as_dict(attrs=['pid', 'name', 'username'])
                    services.append(proc_info)
                except (psutil.NoSuchProcess, psutil.AccessDenied):
                    pass
            return services
        except Exception as e:
            logger.error(f"获取运行服务信息时发生错误: {e}")
            return []
    
    @staticmethod
    def check_system_health() -> Tuple[bool, List[str]]:
        """检查系统健康状态.
        
        检查项目:
        - CPU使用率 (警告阈值: 80%)
        - 内存使用率 (警告阈值: 80%)
        - 磁盘使用率 (警告阈值: 80%)
        - 交换空间使用率 (警告阈值: 80%)
        
        Returns:
            Tuple[bool, List[str]]: 健康状态和警告信息列表
        """
        try:
            warnings = []
            
            # 检查CPU使用率
            cpu_percent = psutil.cpu_percent()
            if cpu_percent > 80:
                warnings.append(f"CPU使用率过高: {cpu_percent}%")
            
            # 检查内存使用率
            memory = psutil.virtual_memory()
            if memory.percent > 80:
                warnings.append(f"内存使用率过高: {memory.percent}%")
            
            # 检查磁盘使用率
            disk = psutil.disk_usage('/')
            if disk.percent > 80:
                warnings.append(f"磁盘使用率过高: {disk.percent}%")
            
            # 检查交换空间使用率
            swap = psutil.swap_memory()
            if swap.percent > 80:
                warnings.append(f"交换空间使用率过高: {swap.percent}%")
            
            return len(warnings) == 0, warnings
            
        except Exception as e:
            logger.error(f"检查系统健康状态时发生错误: {e}")
            return False, [str(e)]